package br.com.sisgerenciamento.dao.usuario;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.com.sisgerenciamento.exceptions.AlterarException;
import br.com.sisgerenciamento.exceptions.ApplicationException;
import br.com.sisgerenciamento.exceptions.ExcluirException;
import br.com.sisgerenciamento.exceptions.InserirException;
import br.com.sisgerenciamento.generic.GenericDAO;
import br.com.sisgerenciamento.model.usuario.UsuarioVO;


public class UsuarioDAOServiceImpl extends GenericDAO< UsuarioVO > implements UsuarioDAOService{

	public UsuarioVO inserir(UsuarioVO vo) throws InserirException {
		return (UsuarioVO) insert(vo);
	}

	public void alterar(UsuarioVO vo) throws AlterarException {
		update(vo);
	}

	public void excluir(UsuarioVO vo) throws ExcluirException {
		delete(vo);
	}

	public UsuarioVO obterUsuarioLogado(Long codigo) throws ApplicationException {
		try {
			Map<String,Object> filtro = new HashMap<String,Object>();
			filtro.put("codigo", codigo);
			ArrayList<UsuarioVO> usuarioVOs = findCriteria(UsuarioVO.class, filtro);
			return usuarioVOs.get(0);
		}catch (Exception e) {
			throw new ApplicationException(e.getMessage());
		}
	}

	public ArrayList<UsuarioVO> listar() throws ApplicationException {
		Session session = null;
		try{
			session = getSessionAberta();
			Criteria criteria = session.createCriteria(UsuarioVO.class);
			criteria.addOrder(Order.asc("nome"));
			return filtro(criteria);
		}catch (Exception e) {
			throw new ApplicationException(e.getMessage());
		}finally{
			if(session != null)
				session.close();
		}
	}

	public UsuarioVO obterUsuarioPorLogin(String login)throws ApplicationException {
		Session session = null;
		try{
			session = getSessionAberta();
			Criteria criteria = session.createCriteria(UsuarioVO.class);
			criteria.add(Restrictions.eq("login", login));
			return (UsuarioVO) consultar(criteria);
		}catch (Exception e) {
			throw new ApplicationException(e.getMessage());
		}finally{
			if(session != null)
				session.close();
		}
	}

}
